/*****************************************************************************************
* 文件标识：Ch1.c
* 摘要：LED点亮
* 当前版本：1.1
* 作者：
* 完成日期：
*****************************************************************************************/
#include <reg51.h>
#include "display.h"
#include <intrins.h>
#include <stdio.h>
#include "key.h"
#include "delay.h"
#include "temp.h"

sbit PWM_PIN = P3^4;  // 定义PWM输出引脚
unsigned char timer0_count;  // 用于定时器0计数
unsigned char timer1_count;  // 用于定时器1计数
unsigned char KeyValue;  // 用来存放读取到的键值

// 定义工作模式
typedef enum {
    MODE_SLEEP = 0, // 睡眠风
    MODE_NATURAL,   // 自然风
    MODE_CONSTANT,  // 常风
    MODE_COUNT
} WorkMode;

// 定义全局变量
WorkMode currentMode = MODE_SLEEP;
unsigned int currentTimer = 0; // 当前定时时间（分钟）
unsigned int remainingTime = 0; // 剩余工作时间（分钟）
int isShowingTemperature = 1; // 是否显示室温
int currentTemperature = 25; // 当前室温（示例值）
static unsigned int count = 0;

void DisplayMode(WorkMode mode);
void DisplayModeAndTime(WorkMode mode, unsigned int time);
void DisplayTemperature();
void StartTimer(void);
void StopPWM(void);
void Timer0ISR(void);
void Timer1ISR(void);
void ProcessKeys(void);
void InitTimer(void);
void InitPWM(void);
void UpdateTemperature(void);

/*******************************************************************************
* 函 数 名         : main
* 函数功能         : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
int main(void) {
    // 初始化GPIO、定时器等
    InitTimer(); // 初始化定时器
    Ds18b20Init(); // 初始化温度传感器
    InitPWM(); // 初始化PWM
	IP = 0x02;    // Timer1为高优先级
    while (1) {
        ProcessKeys();
        if (isShowingTemperature) {
            DisplayTemperature();
        } else {
            // 更新数码管显示当前工作模式和剩余时间
            DisplayModeAndTime(currentMode, remainingTime);
        }
    }
}

/*******************************************************************************
* 函 数 名         : ProcessKeys
* 函数功能         : 处理按键事件
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ProcessKeys(void) {
    int keyValue = KeyDown();
    switch (keyValue) {
        case 4: // S4 - 工作模式切换
            currentMode = (WorkMode)((currentMode + 1) % MODE_COUNT);
            DisplayModeAndTime(currentMode, remainingTime);
            keyValue = 0;
            break;
        case 8: // S5 - 定时按键
            currentTimer += 60;
            remainingTime = currentTimer;
            // 重启倒计时
            StartTimer();
            keyValue = 0;
            break;
        case 12: // S6 - 停止按键
            remainingTime = 0;
            currentTimer = 0;
            // 停止PWM信号输出
            StopPWM();
            keyValue = 0;
            break;
        case 16: // S7 - 室温按键
            isShowingTemperature =!isShowingTemperature;
            keyValue = 0;
            break;
        default:
            break;
    }
    // 实时更新温度
    UpdateTemperature();
}

/*******************************************************************************
* 函 数 名         : DisplayMode
* 函数功能         : 显示当前工作模式
* 输    入         : mode - 当前工作模式
* 输    出         : 无
*******************************************************************************/
void DisplayMode(WorkMode mode) {
    // 这里可以根据工作模式进行数码管显示
    // 例如：将模式编码后显示在数码管上
    // 目前仅为示例，实际需根据数码管硬件进行配置
    switch (mode) {
        case MODE_SLEEP:
            // 假设数码管显示编码，这里简单示例
            DisplayData[0] = 0x40;
            DisplayData[1] = 0x06;
            DisplayData[2] = 0x40;
            // 其他数码管段配置
            break;
        case MODE_NATURAL:
            DisplayData[0] = 0x40;
            DisplayData[1] = 0x5b;
            DisplayData[2] = 0x40;
            // 其他数码管段配置
            break;
        case MODE_CONSTANT:
            DisplayData[0] = 0x40;
            DisplayData[1] = 0x4f;
            DisplayData[2] = 0x40;
            // 其他数码管段配置
            break;
        default:
            break;
    }
    DigDisplay();
}

/*******************************************************************************
* 函 数 名         : DisplayModeAndTime
* 函数功能         : 显示当前工作模式和剩余时间
* 输    入         : mode - 当前工作模式, time - 剩余时间
* 输    出         : 无
*******************************************************************************/
void DisplayModeAndTime(WorkMode mode, unsigned int time) {
    DisplayMode(mode);
    // 显示剩余时间
    DisplayData[4] = DIG_CODE[time / 1000];
    DisplayData[5] = DIG_CODE[time % 1000 / 100];
    DisplayData[6] = DIG_CODE[(time % 100) / 10];
    DisplayData[7] = DIG_CODE[time % 10];
    DigDisplay();
}

/*******************************************************************************
* 函 数 名         : DisplayTemperature
* 函数功能         : 显示当前室温
* 输    入         : temperature - 当前室温
* 输    输出         : 无
*******************************************************************************/
void DisplayTemperature() {
    // 显示当前室温
    // 这里假设Display_temp函数已经定义
    Display_temp(currentTemperature);
}

/*******************************************************************************
* 函 数 名         : StartTimer
* 函数功能         : 重启倒计时
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void StartTimer(void) {
    // 启动定时器
    TMOD |= 0x01; // 设置定时器0为模式1
    TH0 = (65536 - 50000) >> 8; // 预装初值，50ms定时
    TL0 = (65536 - 50000) & 0xff;
    ET0 = 1; // 允许定时器0中断
    EA = 1;  // 允许总中断
    TR0 = 1; // 启动定时器0
}

/*******************************************************************************
* 函 数 名         : StopPWM
* 函数功能         : 停止PWM信号输出
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void StopPWM(void) {
    // 停止PWM信号输出
    TR1 = 0; // 停止定时器1
    PWM_PIN = 0; // 将PWM引脚设置为低电平
}

/*******************************************************************************
* 函 数 名         : Timer0ISR
* 函数功能         : 定时器0中断服务程序
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0ISR(void) interrupt 1 {
    TH0 = (65536 - 50000) >> 8; // 重装初值
    TL0 = (65536 - 50000) & 0xff;
    count++;
    if (count >= 20) { // 每1秒
        count = 0;
        if (remainingTime > 0) {
            remainingTime--;
            if (remainingTime == 0) {
                StopPWM();
            }
        }
        if (!isShowingTemperature) {
            DisplayModeAndTime(currentMode, remainingTime);
        }
    }
}

/*******************************************************************************
* 函 数 名         : Timer1ISR
* 函数功能         : 定时器1中断服务程序
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1ISR(void) interrupt 3 {
    // 确保重新赋初值正确
    TH1 = 0xFE;
    TL1 = 0x0C;
    timer1_count++;
    if (timer1_count > 100) {  // PWM周期为100*0.5ms
        timer1_count = 0;
    }
    // 根据不同工作模式调整PWM占空比
    switch (currentMode) {
        case MODE_SLEEP:
            if (timer1_count < 30) { // 调整占空比为30%
                PWM_PIN = 1;
                // 可以添加调试输出，例如：
                // printf("PWM_PIN set high for MODE_SLEEP\n");
            } else {
                PWM_PIN = 0;
            }
            break;
        case MODE_NATURAL:
            if (timer1_count < 50) { // 调整占空比为50%
                PWM_PIN = 1;
            } else {
                PWM_PIN = 0;
            }
            break;
        case MODE_CONSTANT:
            if (timer1_count < 70) { // 调整占空比为70%
                PWM_PIN = 1;
            } else {
                PWM_PIN = 0;
            }
            break;
        default:
            break;
    }
}

/*******************************************************************************
* 函 数 名         : InitTimer
* 函数功能         : 初始化定时器
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void InitTimer(void) {
    TMOD = 0x00; // 定时器0初始化为模式0
    TH0 = 0;
    TL0 = 0;
    ET0 = 0; // 禁止定时器0中断
    EA = 1;  // 允许总中断
    TR0 = 0; // 停止定时器0
		TR1 = 0; // 停止定时器1
}

/*******************************************************************************
* 函 数 名         : InitPWM
* 函数功能         : 初始化PWM
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void InitPWM(void) {
    TMOD |= 0x10;   // 设置定时器1为模式1
    //--定时器赋初始值，12MHZ下定时0.5ms--//
    TH1 = 0xFE;
    TL1 = 0x0C;
    ET1 = 1;  // 开启定时器1中断
    EA = 1;
    TR1 = 1;  // 开启定时器1
		TR0 = 1;  // 开启定时器1
	
    // 可以添加调试输出，例如：
    // printf("PWM initialized\n");
}

/*******************************************************************************
* 函 数 名         : UpdateTemperature
* 函数功能         : 更新温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void UpdateTemperature(void) {
    currentTemperature = Ds18b20ReadTemp();
}